Traits কী?
রাস্টে Traits একটি শক্তিশালী বৈশিষ্ট্য যা একটি টাইপের আচরণ (behavior) বা ইন্টারফেস সংজ্ঞায়িত করতে ব্যবহৃত হয়। এটি Java বা C# এর ইন্টারফেসের মতো, তবে কিছু পার্থক্যও রয়েছে। Traits একটি বা একাধিক ফাংশন সিগনেচার ধারণ করে, যেগুলি বাস্তবায়ন (implementation) করতে হবে। এটি একটি টাইপের জন্য সাধারণ আচরণ বা গুণাবলী নির্ধারণ করে এবং অন্য টাইপে এই আচরণ প্রয়োগ করার জন্য ব্যবহার করা হয়।
Traits এর মূল উদ্দেশ্য:
- ব্যবহারযোগ্যতা (Reusability): Traits একই আচরণ বা বৈশিষ্ট্য একাধিক টাইপে প্রয়োগ করতে সক্ষম।
- প্রতিক্রিয়া (Polymorphism): Traits এর মাধ্যমে ভিন্ন ধরনের টাইপে একে অপরের মত আচরণ সংজ্ঞায়িত করা সম্ভব।
Traits সংজ্ঞায়িত করা
রাস্টে একটি Trait সংজ্ঞায়িত করতে trait কিওয়ার্ড ব্যবহার করা হয়। Trait এর মধ্যে এক বা একাধিক ফাংশনের সিগনেচার থাকতে পারে, যা একটি নির্দিষ্ট টাইপে বাস্তবায়ন করা প্রয়োজন।
উদাহরণ:
// Trait সংজ্ঞায়িত করা
trait Greet {
fn greet(&self); // সিগনেচার, যেটি ফাংশনের ভিতরে বাস্তবায়ন করতে হবে
}
// Trait এর বাস্তবায়ন
struct Person {
name: String,
}
impl Greet for Person {
fn greet(&self) {
println!("Hello, {}!", self.name);
}
}
fn main() {
let person = Person {
name: String::from("Alice"),
};
person.greet(); // "Hello, Alice!"
}এখানে, Greet একটি Trait যা greet নামক ফাংশন সিগনেচার ধারণ করে। Person struct-এ Greet Trait বাস্তবায়ন করা হয়েছে, যা greet ফাংশনটি প্রিন্ট করবে।
Trait এর সাথে Default Methods
রাস্টে Traits এ default methods বা ডিফল্ট ফাংশনও থাকতে পারে। এর মানে হলো, Trait-এর মধ্যে কিছু ফাংশনের বাস্তবায়ন প্রদান করা যেতে পারে, এবং টাইপগুলো যদি প্রয়োজন মনে না করে তবে তারা এই ডিফল্ট বাস্তবায়ন ব্যবহার করতে পারে।
উদাহরণ:
trait Greet {
fn greet(&self);
// ডিফল্ট বাস্তবায়ন
fn farewell(&self) {
println!("Goodbye!");
}
}
struct Person {
name: String,
}
impl Greet for Person {
fn greet(&self) {
println!("Hello, {}!", self.name);
}
}
fn main() {
let person = Person {
name: String::from("Bob"),
};
person.greet(); // "Hello, Bob!"
person.farewell(); // "Goodbye!"
}এখানে, farewell ফাংশনটির ডিফল্ট বাস্তবায়ন দেওয়া হয়েছে Trait-এ, এবং Person struct-এ greet বাস্তবায়ন করা হয়েছে, কিন্তু farewell এর ডিফল্ট বাস্তবায়ন ব্যবহার করা হয়েছে।
Traits এবং Polymorphism
রাস্টে Traits ব্যবহার করে polymorphism বা বহুরূপিতা অর্জন করা সম্ভব। এর মানে হলো, একাধিক টাইপ একই Trait ব্যবহার করে এবং একে অপরের মত আচরণ করতে পারে।
উদাহরণ:
trait Describe {
fn describe(&self) -> String;
}
struct Person {
name: String,
}
struct Animal {
species: String,
}
impl Describe for Person {
fn describe(&self) -> String {
format!("This is a person named {}", self.name)
}
}
impl Describe for Animal {
fn describe(&self) -> String {
format!("This is an animal of species {}", self.species)
}
}
fn print_description(item: impl Describe) {
println!("{}", item.describe());
}
fn main() {
let person = Person {
name: String::from("Alice"),
};
let animal = Animal {
species: String::from("Dog"),
};
print_description(person); // "This is a person named Alice"
print_description(animal); // "This is an animal of species Dog"
}এখানে, Describe Trait দুটি ভিন্ন struct (Person এবং Animal) এ বাস্তবায়িত হয়েছে। print_description ফাংশনটি Describe Trait গ্রহণ করে, এবং এটি Person এবং Animal টাইপের জন্য একে অপরের মতো আচরণ করতে সক্ষম।
Trait Bounds
Trait bounds হল এমন নিয়ম যা টাইপের জন্য Trait বাস্তবায়ন নিশ্চিত করে, যাতে সেই টাইপ শুধুমাত্র নির্দিষ্ট Trait ব্যবহার করতে পারে।
উদাহরণ:
// Trait সংজ্ঞায়িত করা
trait Printable {
fn print(&self);
}
// Trait বাস্তবায়ন
struct Book {
title: String,
}
impl Printable for Book {
fn print(&self) {
println!("Book title: {}", self.title);
}
}
// একটি ফাংশনে Trait Bound ব্যবহার
fn print_item<T: Printable>(item: T) {
item.print();
}
fn main() {
let book = Book {
title: String::from("Rust Programming"),
};
print_item(book);
}এখানে, print_item ফাংশনে T: Printable Trait bound ব্যবহার করা হয়েছে, যা T টাইপের জন্য Printable Trait নিশ্চিত করে।
সারাংশ
- Traits রাস্টে একটি টাইপের আচরণ সংজ্ঞায়িত করতে ব্যবহৃত হয়। Traits সঠিকভাবে ব্যবহার করলে প্রোগ্রামিংয়ে polymorphism, reusability, এবং abstraction সুবিধা পাওয়া যায়।
- Traits এর মাধ্যমে বিভিন্ন টাইপে একই ধরনের আচরণ প্রয়োগ করা যেতে পারে, এবং Traits-এ default methods ব্যবহার করে ডিফল্ট আচরণ দেওয়া সম্ভব।
- Traits bounds ব্যবহার করে কোনো টাইপের জন্য নির্দিষ্ট Trait বাস্তবায়ন নিশ্চিত করা যায়, যার মাধ্যমে আরও শক্তিশালী এবং নমনীয় কোড লেখা সম্ভব।
Read more